#pragma once 
#include<iostream>
#include<assert.h>

using namespace std;

#define MAX 15
namespace dsh
{
    class stack
    {
    public:
        stack()
            :_data(nullptr)
             ,_top(0)
        {
            _data = new int[MAX];
        }
        ~stack()
        {
            delete[] _data;
            _data = nullptr;
            _top = 0;
        }

        void push(const int& x)
        {
            assert(_top != MAX);
            _data[_top] = x;
            _top++;
        }
        bool empty()
        {
            return _top == 0;
        }
        void pop()
        {
            assert(!empty());
            _top--;
        }
        int& top()
        {
            return _data[_top - 1];
        }
        int size()
        {
            return _top;
        }

    private:
        int* _data;
        int _top;
    };
    void test_stack1()
    {
        stack st;
        st.push(1);
        st.push(2);
        st.push(3);
        st.push(4);
        st.push(5);
        int size = st.size();
        for (int i = 0; i < size; i++)
        {
            cout << st.top() << " ";
            st.pop();
        }
        cout << endl;
    }
}
